package ren.nearby.http.base;

import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import com.orhanobut.logger.Logger;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import ren.nearby.http.R;
import ren.nearby.http.utils.OsUtil;


/**
 * 需要toolbar标题栏 和 管理rx生命周期的 就由子类重写方法
 */
public abstract class BaseTitleActivity<T extends IPresenter> extends AppCompatActivity {


    /**
     * 显示标题栏
     *
     * @return
     */
    public String showTitle() {
        return getResources().getString(R.string.app_name);
    }


    /**
     * 是否需要加载数据失败预览
     *
     * @return
     */
    public boolean isStateLayout() {
        return false;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setStatusBar();
    }

    /**
     * 适配透明状态栏-沉浸式状态栏
     */
    protected void setStatusBar() {
        //4.4以上才有透明状态栏一说。低版本暂时无法适配
        Window window = getWindow();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //兼容5.0 状态栏半透明情况， 貌似并没有什么卵用(机型锤子T2 5.0系统)(跟厂商定制有关原生有用)
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            // Translucent status bar
            window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

    /**
     * 获取状态栏的高度
     *
     * @return
     */
    protected int getStatusBarHeight() {
        int statusBarHeight = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
        return statusBarHeight;
    }

    /**
     * 根据版本不同设置状态栏颜色不同
     * 适适配白底标题栏(方案一)改变状态栏字体颜色
     * 适配方案1, 4.4以下的不适配，4.4-5.0的也不适配，5.0-6.0修改状态栏颜色为浅灰色，6.0以上修改状态栏字体颜色
     * 因为修改状态栏颜色5.0以上才支持，所以5.0以下的不适配
     *
     * @param isLight 标题栏颜色是否为浅色(白色)
     */
    protected void setColorStatusBar(boolean isLight, int statsBarcolor) {
        Logger.e("进来了 setColorStatusBar ");
        if (OsUtil.isMIUI() || OsUtil.isFlyme() || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            setStatusBarTextDark(isLight);
            Logger.e("进来了 if ");
        } else {
            Logger.e("进来了 else  ");
            Window window = getWindow();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0以上
                Logger.e("进来了 else  if ");

                //兼容5.0 状态栏半透明情况， 貌似并没有什么卵用(机型锤子T2 5.0系统)(跟厂商定制有关原生有用)
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                window.setStatusBarColor(statsBarcolor);
            } else { //4.4-5.0 以及 4.4以下
                Logger.e("进来了 else  else ");
                //这是一个开源库，支持4.4以上修改状态栏颜色 这里我就不适配了
//                compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
//                SystemBarTintManager tintManager = new SystemBarTintManager(activity);
//                tintManager.setStatusBarTintEnabled(true);
//                tintManager.setStatusBarTintResource(colorId);
                window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    }

    /**
     * 修改状态栏字体颜色只能在android6.0以上原生系统中，同时小米和魅族提供有方法，其他厂商可能无效过
     * 设置Android状态栏的字体颜色，状态栏为亮色的时候字体和图标是黑色，状态栏为暗色的时候字体和图标为白色
     *
     * @param dark 状态栏字体和图标是否为深色
     */
    protected void setStatusBarTextDark(boolean dark) {
        if (OsUtil.isMIUI()) {
            // 小米MIUI
            try {
                Window window = getWindow();
                Class clazz = getWindow().getClass();
                Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
                Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
                int darkModeFlag = field.getInt(layoutParams);
                Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
                if (dark) {    //状态栏亮色且黑色字体
                    extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
                } else {       //清除黑色字体
                    extraFlagField.invoke(window, 0, darkModeFlag);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }
        if (OsUtil.isFlyme()) {
            // 魅族FlymeUI
            try {
                Window window = getWindow();
                WindowManager.LayoutParams lp = window.getAttributes();
                Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
                darkFlag.setAccessible(true);
                meizuFlags.setAccessible(true);
                int bit = darkFlag.getInt(null);
                int value = meizuFlags.getInt(lp);
                if (dark) {
                    value |= bit;
                } else {
                    value &= ~bit;
                }
                meizuFlags.setInt(lp, value);
                window.setAttributes(lp);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return;
        }

        // android6.0+系统
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (dark) {
                Logger.e("6.0+ if");
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            } else {
                Logger.e("6.0+ else");
                getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            }
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        //获取子类实现的操作层 管理生命周期
        mPresenter = getPresenter();
    }

    /**
     * 管理操作数据层的生命周期
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
//        Logger.e(mPresenter == null ? "mPresenter onDestroy - 1 " : "mPresenter onDestroy - 0 ");
        if (mPresenter != null) {
            mPresenter.detachView();
        }

    }

    /**
     * 操作数据层
     */
    protected T mPresenter;

    /**
     * 抽象由子类实现
     *
     * @return
     */
    public abstract T getPresenter();

    /**
     * 加载布局文件
     *
     * @return
     */
    public abstract int getContentView();


    /**
     * 初始化控件布局绑定
     */
    public abstract void initKnife();

    /**
     * 初始化控件
     */
    public abstract void initView();

    /**
     * 当前activity
     *
     * @return
     */
    public abstract BaseActivity getActivity();
}
